package com.blog.cloud.auth.router;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

/*
* Spring RestTemplate 类本质上是阻塞的。因此，我们不想在反应式应用程序中使用它。对于反应式应用，Spring 提供了 WebClient 类，
* 它是非阻塞的。我们使用基于 WebClient 的实现来消费我们的 RESTful 服务：
*
* WebClient 类使用了反应式特性，以 Mono 的形式保存消息内容（由 getMessage 方法返回）。这是在使用函数式 API，而不是命令式 API，来连锁反应式操作符。
* 习惯反应式 API 可能需要一些时间，但 WebClient 具有有趣的特性，也可用于传统的 Spring MVC 应用程序。
* */
@Component
public class GreetingClient {

    private final WebClient client;

    // Spring Boot 会自动配置一个具有良好默认值和自定义功能的 `WebClient.Builder` 实例。
    // 我们可以使用它为我们的组件创建一个专用的 `WebClient`。
    public GreetingClient(WebClient.Builder builder) {
        this.client = builder.baseUrl("http://localhost:8080").build();
    }

    public Mono<String> getMessage() {
        return this.client.get().uri("/hello").accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .bodyToMono(Greeting.class)
                .map(Greeting::getMessage);
    }

}